Multi-Level Marketing (MLM) là một hình thức kinh doanh mà người bán hàng không chỉ kiếm tiền từ việc bán hàng mà còn kiếm tiền từ việc tuyển thành viên khác vào hệ thống. Mỗi thành viên mới được tuyển vào sẽ tạo ra một cấp dưới cho người tuyển dụng. Người tuyển dụng sẽ nhận được một phần hoa hồng từ doanh số bán hàng của cấp dưới. Cấp dưới cũng có thể tuyển thêm thành viên mới và tạo ra một cấp dưới khác. Người tuyển dụng sẽ nhận được một phần hoa hồng từ doanh số bán hàng của cấp dưới thứ hai và tiếp tục như vậy.
Trong thế giới ảo của trò chơi Warcraft, tiếp thị đa cấp (MLM) không phải là một khái niệm xa lạ. Các người chơi thường xuyên tham gia vào các hệ thống MLM để tăng cường khả năng chiến đấu của họ và kiếm thêm tiền trong trò chơi. Tuy nhiên, liệu chúng ta có thể áp dụng các nguyên tắc của MLM vào thế giới thực bên ngoài trò chơi?
Việc lập kế hoạch và tính toán thù lao trong các tổ chức bán hàng phức tạp có thể gây áp lực rất lớn đối với cơ sở dữ liệu truyền thống. Các tổ chức đủ lớn thường sẽ kết hợp các quy trình này qua đêm hoặc thành công việc hàng tuần.
Với mục đích của bài này, chúng ta hãy xem Slashco: “bang hội” tiếp thị đa cấp hot nhất trong World of Warcraft
Trong bang hội này, các "cộng sự" có thể tham gia và bán thiết bị phiêu lưu tốt nhất của Slashco cho nhiều người ở Azeroth cũng như chiêu mộ bạn bè và gia đình của họ để bán các sản phẩm của Slashco. Khi một cộng sự tuyển dụng ai đó vào bang hội, thành viên mới đó sẽ trở thành một phần của “hạ lưu” của cộng sự đó. Với tư cách là tiền bản quyền khi thu hút thành viên mới này, các cộng sự sẽ nhận được một khoản hoa hồng nhỏ cho mỗi mặt hàng được bán bởi các thành viên “hạ nguồn” của họ.
Trong lịch trình trả thưởng này, chúng tôi có các pháp sư bán hàng, những người sẽ vừa trực tiếp bán sản phẩm vừa tuyển người để bán sản phẩm thay mặt cho Slashco. Tôi đã tạo một mô hình mẫu dựa trên mô hình tiếp thị đa cấp phổ biến. Nó bao gồm bốn dòng thu nhập:
Dưới đây là ví dụ về cách một tổ chức MLM điển hình có thể trả thù lao cho các cộng sự của mình:
Chúng tôi thấy rằng, tùy thuộc vào cấp độ của bạn, cách bạn được trả lương cho cả doanh số bán hàng trực tiếp và dòng thu nhập thụ động của mình có thể khác nhau rất nhiều. Như vậy, việc tính toán mức hoa hồng có thể rất khó khăn.
Dữ liệu về các giao dịch và cấp bậc của các thành viên trong tổ chức MLM có thể được lưu trữ trong một cơ sở dữ liệu đồ thị. Trong bài viết này, chúng ta sẽ sử dụng Neo4j, một cơ sở dữ liệu đồ thị phổ biến, để lưu trữ và truy vấn dữ liệu về tổ chức MLM của Slashco.
Trước khi chúng tôi thực sự tải bất kỳ dữ liệu nào vào Neo4j, điều quan trọng là phải biết những câu hỏi nào sẽ quan trọng đối với hoạt động kinh doanh của chúng tôi. Trong trường hợp này, chúng tôi đang lập mô hình một công cụ trả thưởng cho doanh số bán hàng. Các truy vấn phổ biến nhất của chúng tôi có thể giống như:
Khi biết những câu hỏi này, chúng ta có thể xây dựng một mô hình giúp dễ dàng trả lời những câu hỏi đó một cách nhanh chóng và hiệu quả.
Các file dữ liệu cho bài toán MLM: Các dữ liệu được lưu trữ trong các file CSV sau:
Trước khi nhập dữ liệu, chúng ta nên chuẩn bị cơ sở dữ liệu bằng cách tạo các chỉ mục và ràng buộc. Cần đảm bảo rằng các nút Person, Item, Transaction, và Period có các thuộc tính id duy nhất bằng cách tạo các ràng buộc đối với chúng. Tạo một ràng buộc duy nhất cũng ngầm tạo ra một chỉ mục. Bằng cách lập chỉ mục thuộc tính id, node lookup (ví dụ: bằng MATCH) sẽ nhanh hơn nhiều.
employeeID của các nút Person để đảm bảo rằng các nút có nhãn Person sẽ có thuộc tính employeeID duy nhất.CREATE CONSTRAINT employeeIDConstraint FOR (p:Person) REQUIRE p.employeeID IS UNIQUE;
itemID của Item node.CREATE CONSTRAINT itemIDConstraint FOR (i:Item) REQUIRE i.itemID IS UNIQUE;
Transaction và PeriodCREATE CONSTRAINT transactionIDConstraint FOR (t:Transaction) REQUIRE t.transactionID IS UNIQUE;
CREATE CONSTRAINT periodContraint FOR (p:Period) REQUIRE p.period IS UNIQUE;
price của Item nodeCREATE INDEX FOR (i:Item) ON (i.price);
CREATE INDEX FOR (i:Item) ON (i.wholesalePrice);
WITH range(1,52) as periods
FOREACH (period IN periods |
MERGE (p:Period {period:period}));
NEXT giữa các nút Period để biểu diễn thứ tự tuần trong năm.MATCH (p:Period)
WITH p
ORDER BY p.period
WITH COLLECT(p) as periods
FOREACH (i in RANGE(0, size(periods)-2) |
FOREACH (p1 in [periods[i]] |
FOREACH (p2 in [periods[i+1]] |
MERGE (p1)-[:NEXT]->(p2))));
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/NgocTanHoang/neo4j_MLM/main/data/item.csv" as line
WITH line, toFLOAT(line.price) as price, toInteger(line.item) as itemID, toFLOAT(line.kicker) as kick, toFLOAT(line.wprice) as wholesale
CREATE (:Item {itemID:itemID, name:line.name, price:price, kicker:kick, wholesalePrice:wholesale});
//
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/NgocTanHoang/neo4j_MLM/main/data/employees.csv" as line
WITH line, toInteger(line.employeeID) as empID
CREATE (:Person {employeeID:empID, name:line.name});
//
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/NgocTanHoang/neo4j_MLM/main/data/employees.csv" as line
WITH line, toInteger(line.employeeID) as empID, toInteger(line.reportsTo) as reportsToID
MATCH (sub:Person {employeeID:empID}), (boss:Person {employeeID:reportsToID})
MERGE (sub)-[:REPORTS_TO]->(boss);
//
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/NgocTanHoang/neo4j_MLM/main/data/transactions.csv" as line
WITH line, toInteger(line.transactionID) as transID
CREATE (:Transaction {transactionID:transID});
//
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/NgocTanHoang/neo4j_MLM/main/data/transactions.csv" as line
WITH line, toInteger(line.transactionID) as transID, toInteger(line.period) as period
MATCH (t:Transaction {transactionID:transID}), (p:Period {period:period})
CREATE (t)-[:OCCURRED_IN]->(p);
//
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/NgocTanHoang/neo4j_MLM/main/data/transactions.csv" as line
WITH line,
toInteger(line.transactionID) as transID,
toInteger(line.item1) as itemID1,
toInteger(line.item2) as itemID2,
toInteger(line.item3) as itemID3
MATCH
(tx:Transaction {transactionID:transID}),
(i1:Item {itemID:itemID1}),
(i2:Item {itemID:itemID2}),
(i3:Item {itemID:itemID3})
CREATE
(tx)-[:CONTAINS]->(i1),
(tx)-[:CONTAINS]->(i2),
(tx)-[:CONTAINS]->(i3);
//
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/NgocTanHoang/neo4j_MLM/main/data/transactions.csv" as line
WITH line,
toInteger(line.transactionID) as transID,
toInteger(line.salesRepID) as repID
MATCH (rep:Person {employeeID:repID}),
(tx:Transaction {transactionID:transID})
CREATE
(rep)-[:SOLD]->(tx);
MATCH (target:Person)<-[r:REPORTS_TO*..]-(e)
WITH target, count(e) as totalReports
SET target.reportsCount = totalReports
WITH target,
//setting the right "level" based on number of reports
CASE
WHEN target.reportsCount > 124
THEN 6
WHEN target.reportsCount < 124 and target.reportsCount >= 75
THEN 5
WHEN target.reportsCount < 75 and target.reportsCount >= 25
THEN 4
WHEN target.reportsCount < 25 and target.reportsCount >= 10
THEN 3
WHEN target.reportsCount < 10 and target.reportsCount >= 2
THEN 2
ELSE 1
END AS levels
SET target.level = levels;
Hoa hồng do mỗi đại diện, theo khoảng thời gian phù hợp với các quy tắc trả hoa hồng